import { MsgType } from './index'
import CommandHandler from './command_handler'
import ExtendCommandHandler from '../extend_command_handler'
import ExtendTextHandler from '../extend_text_handler'
import TextHandler from './text_handler'
export default {
    /**
     * 页面自定义注册command {command:handler}
     */
    registeredCommands: {} as any,
    /**
     * 移除注销指定command 只能移除页面自定义注册的 不能移除commandhandler里直接写的
     * @param command 自定义注册的command 多个用逗号隔开
     */
    removeCommand(command: string) {
        if (!command) {
            return
        }
        if (Array.isArray(command)) {
            for (const cmd of command) {
                if (cmd) {
                    this.registeredCommands[cmd] = null
                }
            }
        } else if (command.indexOf(',') != -1) {
            const cmds = command.split(',')
            for (const cmd of cmds) {
                if (cmd) {
                    this.registeredCommands[cmd] = null
                }
            }
        } else {
            this.registeredCommands[command] = null
        }
        console.log('removeCommand:', command)
    },
    /**
     * 触发command-handler
     * @param command 指令名称
     * @param eventData 事件数据
     */
    emitCommand(command: string, eventData: any) {
        if (!command) {
            console.error('emitCommand指定command为空')
            return
        }
        const handler =
            CommandHandler[command] ||
            ExtendCommandHandler[command] ||
            this.registeredCommands[command]
        if (handler) {
            handler(eventData)
        } else {
            console.error(
                'emitCommand没有找到指令[' +
                    command +
                    ']对应处理handler 如果是自定义注册command可能是移除了'
            )
        }
    },
    /**
     * onopen事件
     */
    onopen(event: any) {
        console.debug('handler:websocket connection open.', event)
    },
    /**
     * onmessage事件
     */
    onmessage(event: any) {
        if (event.data) {
            const edata = JSON.parse(event.data)
            if (edata.type == MsgType.COMMAND || edata.type == MsgType.COMMAND_RET) {
                //如果是command 就去执行指令handler处理器 优先找内置处理 内置没有找扩展 扩展没有找页面自定义注册
                this.emitCommand(edata.command, edata)
            } else if (edata.type == MsgType.TEXT) {
                //如果是文本消息 就去执行文本消息handler处理器
                TextHandler.process(edata)
                //调用二开处理文本消息
                ExtendTextHandler.process(edata)
            }
        }
    },
    /**
     * onclose事件
     */
    onclose(event: any) {
        console.warn('JBolt Websocket 被关闭，即将尝试重连', event)
    },
    /**
     * onerror事件
     */
    onerror(event: any) {
        console.error('handler:websocket connection error.', event)
    }
}
